import Modal from "ant-design-vue/es/modal";
export default Vue => {
  function dialog(component, componentProps, modalProps) {
    const _vm = this;
    modalProps = modalProps || {};
    if (!_vm || !_vm._isVue) {
      return;
    }
    let dialogDiv = document.querySelector("body>div[type=dialog]");
    if (!dialogDiv) {
      dialogDiv = document.createElement("div");
      dialogDiv.setAttribute("type", "dialog");
      document.body.appendChild(dialogDiv);
    }

    const handle = function(checkFunction, afterHandel) {
      if (checkFunction instanceof Function) {
        const res = checkFunction();
        if (res instanceof Promise) {
          res.then(c => {
            c && afterHandel();
          });
        } else {
          res && afterHandel();
        }
      } else {
        // checkFunction && afterHandel()
        checkFunction || afterHandel();
      }
    };

    const dialogInstance = new Vue({
      data() {
        return {
          visible: true,
        };
      },
      router: _vm.$router,
      store: _vm.$store,
      mounted() {
        this.$on("close", v => {
          this.handleClose();
        });
      },
      methods: {
        handleClose() {
          handle(this.$refs._component.onCancel, () => {
            this.visible = false;
            this.$refs._component.$emit("close");
            this.$refs._component.$emit("cancel");
            dialogInstance.$destroy();
          });
        },
        handleOk() {
          handle(this.$refs._component.onOK || this.$refs._component.onOk, () => {
            this.visible = false;
            this.$refs._component.$emit("close");
            this.$refs._component.$emit("ok");
            dialogInstance.$destroy();
          });
        },
      },
      render: function(h) {
        const that = this;
        const modalModel = modalProps && modalProps.model;
        if (modalModel) {
          delete modalProps.model;
        }
        const ModalProps = Object.assign({}, (modalModel && { model: modalModel }) || {}, {
          attrs: Object.assign(
            {},
            {
              ...(modalProps.attrs || modalProps),
            },
            {
              visible: this.visible,
            },
          ),
          on: Object.assign(
            {},
            {
              ...(modalProps.on || modalProps),
            },
            {
              ok: () => {
                that.handleOk();
              },
              cancel: () => {
                that.handleClose();
              },
            },
          ),
        });

        const componentModel = componentProps && componentProps.model;
        if (componentModel) {
          delete componentProps.model;
        }
        const ComponentProps = Object.assign({}, (componentModel && { model: componentModel }) || {}, {
          ref: "_component",
          attrs: Object.assign(
            {},
            {
              ...((componentProps && componentProps.attrs) || componentProps),
            },
          ),
          on: Object.assign(
            {},
            {
              ...((componentProps && componentProps.on) || componentProps),
            },
          ),
        });

        return h(Modal, ModalProps, [h(component, ComponentProps)]);
      },
    }).$mount(dialogDiv);
  }

  Object.defineProperty(Vue.prototype, "$dialog", {
    get: () => {
      return function() {
        dialog.apply(this, arguments);
      };
    },
  });
};
